from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from utils.jwttool import meansjwt
import jwt
from user import models


class MyAuthorization(BaseAuthentication):
    def authenticate(self, request):
        # 1获取到token
        token = request.META.get("HTTP_AUTHORIZATION", "")
        if not token:
            raise AuthenticationFailed("缺少token")
        # 2 解析token 有可能产生异常  失效  错改 没有问题能拿到用户信息
        try:
            user = meansjwt.parseToken(token)
            info = models.user.objects.filter(id=user["id"]).first()
            if not info:
                raise AuthenticationFailed("用户不存在")
            return info, token
        except jwt.InvalidTokenError:
            raise AuthenticationFailed("token无效")  # 被篡改
        except jwt.ExpiredSignatureError:
            raise AuthenticationFailed("token过期")
        # 3 返回用户信息
        # 根据解析到用户信息 去数据库中查询 如果有 继续访问 没有 返回401 没有授权 重新登录
        return None
